/**
 * 封装axios,减少其对项目的依赖,可以使用多个export function 方法,解决资源不在同一服务器乃至端口的问题
 */
import store from "../store";
import axios from 'axios'
import router from "../router";
// let _this = this;
//因为在function () {}, 方法内this指向的是有问题的,甚至为undefined,所以使用箭头函数的方式来避免这种问题
export const request = config => { // 第一个封装axios的函数; 参数config是传入对象,内含url, params 等参数

  axios.defaults.withCredentials = true //可以把cookie发送到服务器

  /**但是通过axios.creat()方法的源码可以看出,creat()方法就是返回了一个Promise,那么我们就可以直接把这个实例return,在调用处进行调用即可*/
  const instance = axios.create({ //创建axios实例
    baseURL: '/api',
    timeout: 40000
  })

  /**本axios实例的request拦截器,use()方法,参数1:请求发送成功;参数2:请求发送失败<即未发送请求>*/
  instance.interceptors.request.use(
    config => { //请求发送成功到此
      // console.log('request拦截器,发现请求发送成功:'+ typeof config);
      // console.log(config);

      /**每次发送服务器请求时把修饰后的token放到请求头*/
      let token = store.getters.getToken
      // console.log('request.js中的token:'+token);
      if (token) {
        config.headers.authorization = 'Bearer ' + token
      }
      /**每次发送服务器请求时把修饰后的token放到请求头*/

      return config //把拦截的config放行
    },
    err => { //请求发送失败到此
      console.log('request拦截器,发现请求发送失败:' + typeof err);
      console.log(err);

      let status = err.request.status
      console.log('status=' + status);
    }
  )

  /**本axios实例的response拦截器,*/
  instance.interceptors.response.use(
    result => { //服务器响应的结果
      console.log('response拦截器,发现响应成功:' + typeof result);
      // console.log(result);
      // console.log('data=' + result.data);
      // console.log(result.data);

      // let status = result.request.status //获取响应成功的状态码
      // console.log('status=' + status);

      return result.data //把拦截的响应结果数据<data>放行
    },
    err => { //服务器响应失败的
      console.log('response拦截器,发现响应失败:' + typeof err);
      console.log(err);

      let status = err.response.status //获取响应失败的状态码
      console.log('status=' + status); /**获取响应码*/

      if (status === 401) { // token验证失败，身份验证失败
        console.log('token过期');
        store.dispatch('aDestroyState', {})
          .then(res => {
            console.log('token已清空');
            console.log(res);
          })
        router.push('/login')
          .then(res => {
            console.log('已经跳转至登录');
            console.log(res);
          })
      }
      // return err.response

    }
  )

  return instance(config) //返回instance方法,发送网络请求
}

